package com.microservice.salmon.weixin.controller;

import com.microservice.salmon.weixin.domain.BaseMessage;
import com.microservice.salmon.weixin.domain.News;
import com.microservice.salmon.weixin.domain.NewsMessage;
import com.microservice.salmon.weixin.domain.dto.MessageDto;
import com.microservice.salmon.weixin.domain.menu.Menu;
import com.microservice.salmon.weixin.domain.menu.MenuResult;
import com.microservice.salmon.weixin.domain.support.WeiXinAuth;
import com.microservice.salmon.weixin.domain.ticket.AccessToken;
import com.microservice.salmon.weixin.service.WeiXinService;
import com.microservice.salmon.weixin.utils.CheckUtils;
import com.microservice.salmon.weixin.utils.WeiXinUtils;
import com.salmon.common.utils.JacksonUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import static com.microservice.salmon.weixin.utils.WeiXinUtils.MESSAGE_NEWS;

@RestController
@Slf4j
public class WeiXinController {

    @Autowired
    private WeiXinService weixinService;

    @Autowired
    private WeiXinUtils weixinUtils;

    /**
     * 微信对接验证接口
     */
    @GetMapping(value = "/wx/server/config")
    public String weixinServerConfig(String signature,String timestamp,String nonce,String echostr) {
        //验证请求是否是微信发过来的请求
		if(CheckUtils.checkSignature(signature, timestamp, nonce)) {
            return echostr;
        }
        return "";
    }

    /**
     * 微信调用，进行消息处理，
     * @param messageDto xml方式的消息内容，此处进行到实体类的映射
     * @return 消息内容
     */
    @PostMapping(value = "/wx/server/config", produces = {"text/xml;charset=UTF-8","application/xml;charset=UTF-8"},
            consumes = {"text/xml;charset=UTF-8","application/xml;charset=UTF-8"})
    public BaseMessage weixinMessageHandler(@RequestBody MessageDto messageDto) {
        BaseMessage message = null;
        if(WeiXinUtils.MESSAGE_TEXT.equals(messageDto.getMsgType())){
            String content = messageDto.getContent(); // 在微信公众号输入的内容
            if("1".equals(content)){
                StringBuffer sb = new StringBuffer();
                sb.append("本套课程介绍微信公众号开发，主要涉及公众号介绍、编辑模式介绍、开发模式介绍等");
                message = weixinService.handleTextMessage(messageDto.getToUserName(),messageDto.getFromUserName(),sb.toString());
            }else if("2".equals(content)){
                StringBuffer sb = new StringBuffer();
                sb.append("慕课网是垂直的互联网IT技能免费学习网站。以独家视频教程、在线编程工具、学习计划、问答社区为核心特色。在这里，你可以找到最好的互联网技术牛人，也可以通过免费的在线公开视频课程学习国内领先的互联网IT技术。");
                sb.append("慕课网课程涵盖前端开发、PHP、Html5、Android、iOS、Swift等IT前沿技术语言，包括基础课程、实用案例、高级分享三大类型，适合不同阶段的学习人群。以纯干货、短视频的形式为平台特点，为在校学生、职场白领提供了一个迅速提升技能、共同分享进步的学习平台。");
                message = weixinService.handleTextMessage(messageDto.getToUserName(),messageDto.getFromUserName(),sb.toString());
            }else if("3".equals(content)){
                //message = MessageUtil.initText(toUserName, fromUserName, MessageUtil.threeMenu());
            }else if("?".equals(content) || "？".equals(content)){
               // message = MessageUtil.initText(toUserName, fromUserName, MessageUtil.menuText());
            }
        } else if(WeiXinUtils.MESSAGE_EVNET.equals(messageDto.getMsgType())){ // 事件型消息
            String eventType = messageDto.getEvent();
            if(WeiXinUtils.MESSAGE_SUBSCRIBE.equals(eventType)){ //订阅事件
                message = weixinService.handleTextMessage(messageDto.getToUserName(),messageDto.getFromUserName(),"欢迎关注我的微信");
            } else if(WeiXinUtils.MESSAGE_CLICK.equals(eventType)){ // 点击类型
                message = weixinService.handleTextMessage(messageDto.getToUserName(),messageDto.getFromUserName(),"点击了我 ");
            } else if(WeiXinUtils.MESSAGE_VIEW.equals(eventType)){// VIEW 类型
                //String url = messageDto.getEventKey();
            } else if(WeiXinUtils.MESSAGE_SCANCODE.equals(eventType)){ // 扫码类型
                //String key = messageDto.getEventKey();
                //String result = messageDto.getScanCodeInfoDto().getScanResult(); //扫码内容
            } else if(WeiXinUtils.MESSAGE_UNSUBSCRIBE.equals(eventType)) {// 取消订阅

            }
        } else if(WeiXinUtils.MESSAGE_LOCATION.equals(messageDto.getMsgType())){// 位置消息
            String label = messageDto.getLabel(); // 地理位置名称
            //System.out.println(messageDto.getX());
            //System.out.println(messageDto.getY());
            message = weixinService.handleTextMessage(messageDto.getToUserName(),messageDto.getFromUserName(),label);
        }
        return message;
    }

    @PostMapping("/wx/js/sdk/auth")
    public WeiXinAuth obtainWeiXinTicket(String authUrl) {
        try {
            return weixinUtils.getWeiXinJsSDKAuth(URLDecoder.decode(authUrl,"UTF-8"));
        } catch (UnsupportedEncodingException e) {
           log.error("js sdk auth page url error",e);
        }
        return new WeiXinAuth();
    }

    @PostMapping("/wx/create/menu")
    public MenuResult createMenu() {
        AccessToken token = weixinUtils.getAccessToken();
        Menu menu = weixinService.createButton();
        return weixinUtils.createMenu(token.getAccessToken(),JacksonUtils.toJson(menu));
    }


    /*---------------------- 以下为一些测试 ------------------------------------*/

/*    @PostMapping("/wx/access_token")
    public AccessToken obtainAccessToken() {
        return weixinUtils.getAccessToken();
    }

    @PostMapping("/wx/js/sdk/ticket")
    public WeiXinTicket obtainWeiXinJsSdkTicket() {
        return weixinUtils.getJsSdkTicket();
    }*/

    /**
     * 图文消息的组装
     * @return
     */
    @GetMapping(value = "/test/news", produces = "application/xml;charset=UTF-8")
    public NewsMessage initNewsMessage(){
        NewsMessage newsMessage = new NewsMessage();
        List<News> newsList = new ArrayList<>();
        News news = new News();
        news.setTitle("慕课网介绍");
        news.setDescription("慕课网是垂直的互联网IT技能免费学习网站。以独家视频教程、在线编程工具、学习计划、问答社区为核心特色。在这里，你可以找到最好的互联网技术牛人，也可以通过免费的在线公开视频课程学习国内领先的互联网IT技术。慕课网课程涵盖前端开发、PHP、Html5、Android、iOS、Swift等IT前沿技术语言，包括基础课程、实用案例、高级分享三大类型，适合不同阶段的学习人群。");
        news.setPicUrl("http://zapper.tunnel.mobi/Weixin/image/imooc.jpg");
        news.setUrl("www.imooc.com");

        newsList.add(news);
        String toUserName = "xxxxxx";
        String fromUserName = "0ppooop";

        newsMessage.setToUserName(fromUserName);
        newsMessage.setFromUserName(toUserName);
        newsMessage.setCreateTime(Calendar.getInstance().getTimeInMillis());
        newsMessage.setMsgType(MESSAGE_NEWS);
        newsMessage.setArticles(newsList);
        newsMessage.setArticleCount(newsList.size());

        System.out.println(JacksonUtils.toPrettyXml(newsMessage));
        return newsMessage;
    }

}
